/*
 * IEntidad.h
 *
 */

#ifndef IENTIDAD_H_
#define IENTIDAD_H_

#include "../physical_layer/ISerializable.h"
#include "../utils/types.h"
#include <string>
#include "../exceptions/ProgramException.h"
using namespace std;

/**
 * Representa una entidad Indexable, ya sea por una estructura b+, hash o lo que sea.
 * Esta entidad tiene que tener un ID numerico
 */
class IEntidad: public ISerializable {

public:
	IEntidad();
	virtual ID getID() const;
	virtual void setID(ID id);

	virtual ~IEntidad();

	virtual string toString();

	//"Esta clase no deberia ser instanciada nunca"
	virtual std::string serialize()=0;

	//no virtual para subclases hasta que sea necesario
	virtual int getDataSize() {
		return this->serialize().length();
	}
	ESTRUCTURAS getTipoEntidad() {
		return this->tipoEntidad;
	}

	void setTipoEntidad(ESTRUCTURAS tipo) {
		this->tipoEntidad = tipo;
	}

	virtual void setIdstring(string idstring) {
		throw ProgramException("El id es numerico");
	}

	virtual bool isStringId() {
		return false;
	}
	virtual string getIdstring() {
		throw ProgramException("El id es numerico");
	}

private:
	//este campo no tiene porque persisitirse. A menos que se en un mismo archivo se guarde mas de un tipo de entidad
	ESTRUCTURAS tipoEntidad;
protected:
	ID id;

};

#endif /* IENTIDAD_H_ */
